
/**************************************************START OF FILE*****************************************************/



/*------------------------------------------------------------------------------------------------------------------
Includes
*/

#include "stm32f0xx_hal.h"
#include "xBsp_Hcs301.h"


/*------------------------------------------------------------------------------------------------------------------
Definitions
*/


//注意改端口时也要改时钟
#define HCS310_GPIO_PORT    GPIOA
#define HCS310_GPIO_PIN     GPIO_PIN_2



/*------------------------------------------------------------------------------------------------------------------
Variables
*/

TIM_HandleTypeDef htim14;       //用于查询的定时器，时间为100us
TIM_HandleTypeDef htim16;       //用于读取数据的定时器，每1us增加1




/*------------------------------------------------------------------------------------------------------------------
Code
*/


/*
*********************************************************************************************************************

@ Brief  : 初始化HCS301通讯相关的芯片外设

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-04 16:28

*********************************************************************************************************************
*/
void xBSP_HCS2301_Init(void)
{

    //IO设置
    xBSP_HCS301_IoInput();

    //中断定时器的配置
    xBSP_HCS301_Tim14Config();

    //做时间差计算的定时器
    xBSP_HCS301_Tim16Config();

}



/*
*********************************************************************************************************************

@ Brief  : 配置为普通输入

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-28 22:09

*********************************************************************************************************************
*/
void xBSP_HCS301_IoInput(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

	__HAL_RCC_GPIOA_CLK_ENABLE();
	

    //GPIO初始化
	//PA3 DIO
	GPIO_InitStruct.Pin = HCS310_GPIO_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLDOWN;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(HCS310_GPIO_PORT, &GPIO_InitStruct);

    HAL_NVIC_DisableIRQ(EXTI2_3_IRQn);
}

/*
*********************************************************************************************************************

@ Brief  : 配置IO为中断输入

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-28 22:09

*********************************************************************************************************************
*/
void xBSP_HCS301_IoInt(void)
{

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    __HAL_RCC_GPIOA_CLK_ENABLE();

	GPIO_InitStruct.Pin = HCS310_GPIO_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Pull = GPIO_PULLDOWN;

	HAL_GPIO_Init(HCS310_GPIO_PORT, &GPIO_InitStruct);

    __HAL_GPIO_EXTI_CLEAR_IT(HCS310_GPIO_PIN);

	//设置定时器中断优先级
	HAL_NVIC_SetPriority(EXTI2_3_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

}


/*
*********************************************************************************************************************

@ Brief  : 读取IO口的状态，用于中断的边沿检测

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-29 16:39

*********************************************************************************************************************
*/
uint8_t xBSP_HCS301_GetPIn(void)
{
    return HAL_GPIO_ReadPin(HCS310_GPIO_PORT ,  HCS310_GPIO_PIN);
}




/*
*********************************************************************************************************************

@ Brief  : 定时器初始化

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-28 22:04

*********************************************************************************************************************
*/
void xBSP_HCS301_Tim14Config(void)
{
    __HAL_RCC_TIM14_CLK_ENABLE();
    
    //时钟输入是48M的。
	htim14.Instance = TIM14;
	htim14.Init.Prescaler = 48-1;						
	htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
	htim14.Init.Period = 100;
	htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
	htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
	if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
	{
		while (1);
	}

	HAL_TIM_Base_Start(&htim14);

	//打开中断
	__HAL_TIM_CLEAR_IT(&htim14 , TIM_IT_UPDATE);
	__HAL_TIM_ENABLE_IT(&htim14 , TIM_IT_UPDATE);

	//设置定时器中断优先级
	HAL_NVIC_SetPriority(TIM14_IRQn, 1, 1);
	HAL_NVIC_EnableIRQ(TIM14_IRQn);

}

/*
*********************************************************************************************************************

@ Brief  : 定时器初始化

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-28 22:05

*********************************************************************************************************************
*/
void xBSP_HCS301_Tim16Config(void)
{
    
    __HAL_RCC_TIM16_CLK_ENABLE();

    //时钟输入是48M的。
	htim16.Instance = TIM16;
	htim16.Init.Prescaler = 48-1;						
	htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
	htim16.Init.Period = 0xFFFF;
	htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
	htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
	if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
	{
		while (1);
	}
	HAL_TIM_Base_Start(&htim16);
}




/*
*********************************************************************************************************************

@ Brief  : 定时器中断函数 查询定时器

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-04 16:32

*********************************************************************************************************************
*/
extern void RFMODLE_CheckStart(void);
void TIM14_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim14);

    //调用HCS301启始信号松检测函数
    RFMODLE_CheckStart();
}



/*
*********************************************************************************************************************

@ Brief  : 外部中断

@ Param  : NONE

@ Return : NONE

@ Author : YWJ(QQ:872180981)

@ Data   : 2020-08-28 22:16

*********************************************************************************************************************
*/
extern void xSYS_HCS301_IRQHandler(void);
void EXTI2_3_IRQHandler(void)
{
	if(__HAL_GPIO_EXTI_GET_IT(HCS310_GPIO_PIN) != RESET)
	{
        //调用中断处理函数
        xSYS_HCS301_IRQHandler();

		//获取电平状态（从而得到角发边沿）
		HAL_GPIO_ReadPin(GPIOC , HCS310_GPIO_PIN);
		//清除状态位
		__HAL_GPIO_EXTI_CLEAR_IT(HCS310_GPIO_PIN);
	}
}


/**************************************************END OF FILE*******************************************************/

